#ifndef MOVEJOINT_H
#define MOVEJOINT_H

#include <QWidget>
#include <QSlider>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QGridLayout>
#include <QGroupBox>
#include <QJsonObject>
#include <QDebug>
#include "joint.h"

#include "cnp.hpp"
#include<QStringList>
#include <mutex>
#include<QMutex>
#include <QJsonParseError>
#include <QJsonValue>
#include <QJsonArray>

struct InitPose
{
    std::vector<double> jointAngle;
    std::vector<double> jointVelocity;
    std::vector<double> endPose;
};

class MoveJoint : public QWidget
{
    Q_OBJECT
public:
    explicit MoveJoint(QWidget *parent = nullptr);
    explicit MoveJoint(const QJsonObject &functionDetails, QWidget *parent = nullptr);
    explicit MoveJoint(const QString &Name,const QJsonObject &functionDetails, QWidget *parent = nullptr);
    void createMoveJoint(QGroupBox *groupBox, const QJsonObject &functionDetails);  // 创建MoveJoint控件

    void getJointAngles(QVBoxLayout *jointsLayout);
    // 结构体也可以用 std::pair<QString, QString>
    std::vector<std::pair<QString, QString>> jointAngles;
    QVBoxLayout *jointsLayoutRef = nullptr;  // 保存 jointsLayout 的引用用于后续操作

    struct JointDefault {
        QString jointName;
        double defaultValue;
    };
    QList<JointDefault> jointDefaults = {
        {"joint_1", 5},  // joint_1 的默认值是 5
        {"joint_2", 90},  // joint_2 的默认值是 90
        {"joint_3", 30},  // joint_3 的默认值是 30
        {"joint_4", 0},  // joint_4 的默认值是 0
        {"joint_5", 0},  // joint_5 的默认值是 0
        {"joint_6", 0},  // joint_6 的默认值是 0
        {"joint_7", 0},  // joint_7 的默认值是 0
    };

    // 新的槽函数，用于接收关节角度变化的信号
    void onJointAngleChanged(const QString &jointName, double angle);
    const InitPose& getInitPose() const {
        return mInitPose;
    }

signals:

private:
    //std::unique_ptr<CNPClient> mPublish;
    //
    CNPClient* mPublish;
    void pubSwitchStatu();//初始化界面时的状态切换
    void pubMoveJoint(const QString &jointName, double angle);//发布joint操作值
    void initPoseCallBack(const CnpMsg &msg);
    void processStatuMessage(const QString &msg);
    void subStatus();

    CnpMsg msgMoveJoint;

    QMutex mutex_;
    InitPose mInitPose;//保存初始位置
    int onceFlag;

};



#endif // MOVEJOINT_H
